home *** CD-ROM | disk | FTP | other *** search
- (herald fix)
-
-
-
- (define (generate-move ref1 ref2)
- (if (neq? ref1 ref2)
- (cond ((and (pair? ref1) (null? (cdr ref1)))
- (generate-move-address (car ref1) ref2))
- ((register? ref2)
- (cond ((register? ref1)
- (emit risc/add ref1 zero ref2))
- ((and (pair? ref1)
- (eq? (car ref1) 'lit))
- (move-small-number (cdr ref1) ref2))
- (else
- (emit-load ref1 ref2))))
- ((register? ref1)
- (emit-store ref1 ref2))
- (else
- (if (and (pair? ref1) (eq? (car ref1) 'lit))
- (move-small-number (cdr ref1) extra)
- (emit-load ref1 extra))
- (emit-store extra ref2)))))
-
- (define (emit-load ro reg)
- (cond ((or (atom? ro) (13bit? (cdr ro)))
- (emit risc/load 'l ro reg))
- (else
- (move-big-constant (cdr ro) ass-reg)
- (emit risc/load 'l (reg-reg (car ro) ass-reg) reg))))
-
- (define (emit-store reg ro)
- (cond ((or (atom? ro) (13bit? (cdr ro)))
- (emit risc/store 'l reg ro))
- (else
- (move-big-constant (cdr ro) ass-reg)
- (emit risc/store 'l reg (reg-reg (car ro) ass-reg)))))
-
-
- (define (generate-move-address from to)
- (cond ((register? to)
- (if (or (atom? from)
- (neq? (car from) to)
- (neq? (cdr from) 0))
- (cond ((13bit? (cdr from))
- (emit risc/add (machine-num (cdr from)) (car from) to))
- (else
- (move-big-constant (cdr from) ass-reg)
- (emit risc/add ass-reg (car from) to)))))
- ((13bit? (cdr from))
- (emit risc/add (machine-num (cdr from)) (car from) extra)
- (emit risc/store 'l extra to))
- (else
- (move-big-constant (cdr from) ass-reg)
- (emit risc/add ass-reg (car from) extra)
- (emit risc/store 'l extra to))))
-
- (define (move-big-constant num reg)
- (emit sparc/sethi (unsigned-num
- (fixnum-logand #x3fffff (fixnum-ashr num 10))) reg)
- (emit risc/or
- (unsigned-num (fixnum-logand #x3ff num))
- reg reg))
-
- (define (reg-reg r1 r2)
- (list 'reg-reg r1 r2))
-
- (define risc/load
- (object (lambda (bv i size ro d)
- (cond ((eq? (car ro) 'reg-reg)
- (load-store-indexed bv i (load-op size) (rnum (cadr ro))
- (rnum (caddr ro)) (rnum d)))
- (else
- (receive (base offset) (get-reg-and-offset ro)
- (load-store-type bv i (load-op size) (rnum base) (rnum d) offset)))))
- ((instruction-as-string self i size ro d)
- (cond ((eq? (car ro) 'reg-reg)
- (format nil "~a (~a:~a),~a" (load-op-name size)
- (rname (cadr ro)) (rname (caddr ro)) (rname d)))
- (else
- (receive (base offset) (get-reg-and-offset ro)
- (format nil "~a ~d(~a),~a" (load-op-name size) offset
- (rname base) (rname d))))))
- ((identification self) "load")))
-
- (define risc/store
- (object (lambda (bv i size d ro)
- (cond ((eq? (car ro) 'reg-reg)
- (load-store-indexed bv i (load-op size) (rnum (cadr ro))
- (rnum (caddr ro)) (rnum d)))
- (else
- (receive (base offset) (get-reg-and-offset ro)
- (load-store-type bv i (store-op size) (rnum base) (rnum d) offset)))))
- ((instruction-as-string self i size d ro)
- (cond ((eq? (car ro) 'reg-reg)
- (format nil "~a ~a,(~a:~a)" (load-op-name size)
- (rname d) (rname (cadr ro)) (rname (caddr ro))))
- (else
- (receive (base offset) (get-reg-and-offset ro)
- (format nil "~a ~a,~d(~a)" (store-op-name size) (rname d)
- offset (rname base))))))
- ((identification self) "store")))
-
- (define (load-store-indexed bv i op3 rs1 rs2 rd)
- (set-16 bv i
- (fx-ior (fixnum-ashl 3 14) ;3 for load-store
- (fx-ior (fixnum-ashl rd 9)
- (fx-ior (fixnum-ashl op3 3)
- (fixnum-ashr rs1 2))))) ;high 3 of rs1
- (set-16 bv (fx+ i 2)
- (fx-ior (fixnum-ashl (fixnum-logand 3 rs1) 14) ;low 2 of sr1
- rs2)))